/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SemanticoPacote;

import SemanticoPacote.TratamentoErroSemantico.ErroSemantico;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class CmdWhile {

    //ExpressaoAritmetica new expAritmetica = ExpressaoAritmetica();
    cmd cmd = new cmd();

    /**
     * Método para verificar sintaxe do comando while
     * @param tabelasimbolos
     * @return true, se a sintaxe estiver correta
     */
    public void sintaxeWhile(TabelaSimbolos tabelasimbolos) {

        String escopo = tabelasimbolos.getEscopo();

        tabelasimbolos.soConsome(); //consome while
        tabelasimbolos.soConsome(); //consome "("
        String tipoVariavel = tabelasimbolos.RetornaTipoDeGlobalDeclarada(tabelasimbolos.getLookahead());
        if(tipoVariavel.equals(""))
        {
            tipoVariavel = tabelasimbolos.RetornaTipoDeLocalDeclarada(tabelasimbolos.getLookahead(), escopo);
        }
        //faz a verificação da expressao logica ou boolean
        if(tabelasimbolos.getLookahead().equals("true") || tabelasimbolos.getLookahead().equals("false"))
        {
            tabelasimbolos.soConsome();
        }
        else if(tabelasimbolos.getTipo().equals("identificador") && tabelasimbolos.superLookahead(1).equals(")"))
        {
            if(!tabelasimbolos.verificaSeVariavelFoiDeclarada(tabelasimbolos.getLookahead())){
                        System.out.println("ERRO SEMANTICO - " + tabelasimbolos.getLookahead() + " na linha " + tabelasimbolos.getLinha() + " variÃ¡vel nÃ£o foi declarada");
                        ErroSemantico.getInstance().getTabelaErros().add("Erro SemÃ¢ntico na linha " +tabelasimbolos.getLinha() + ". DescriÃ§Ã£o: VariÃ¡vel nÃ£o foi declarada");
            }
            if(!tipoVariavel.equals("boolean"))
            {
                System.out.println("ERRO SEMANTICO - " + tabelasimbolos.getLookahead() + " na linha " + tabelasimbolos.getLinha() + " tipo incompativel de variavel");
                ErroSemantico.getInstance().getTabelaErros().add("Erro SemÃ¢ntico na linha " +tabelasimbolos.getLinha() + ". DescriÃ§Ã£o: Tipo imcompativel de variavel");
            }
            tabelasimbolos.soConsome(); //consome o identificador;

        }
        else
                ExpressaoLogica.expLogica(tabelasimbolos, escopo);

           tabelasimbolos.soConsome();//consome o )

        if (tabelasimbolos.getLookahead().equals("{")) {
        tabelasimbolos.soConsome(); //so consome "{"
                    while (verificaInicioCmd(tabelasimbolos)) {
                        System.out.println(" PASSOU COMANDO");
                        cmd.sintaxeCmd(tabelasimbolos,escopo);
                    }
                    tabelasimbolos.soConsome();//consome "}"


         } else if (verificaInicioCmd(tabelasimbolos)) {

                System.out.println(" reconheceu comando sem chave");
                //quando o while só tem um comando (nao tem chaves)
                cmd.sintaxeCmd(tabelasimbolos,escopo);
         }
    }

    /**
     * Verifica se há comando(s) dentro do while
     * @param tabelasimbolos
     * @return true, se há comando dentro do while
     */
    public boolean verificaInicioCmd(TabelaSimbolos tabelasimbolos) {
        if (tabelasimbolos.getTipo().equals("identificador") || tabelasimbolos.getLookahead().equals("*") ||
                tabelasimbolos.getLookahead().equals("scanf") || tabelasimbolos.getLookahead().equals("printf") ||
                tabelasimbolos.getLookahead().equals("if") || tabelasimbolos.getLookahead().equals("while") ||
                tabelasimbolos.getLookahead().equals("do") || tabelasimbolos.getLookahead().equals("for")) {
            return true;
        }

        return false;
    }

    public boolean verificaExpAritmetica(TabelaSimbolos tabelaSimbolos)
    {
        if(tabelaSimbolos.getTipo().equals("numero") || tabelaSimbolos.getTipo().equals("identificador"))
        {
            if(tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("+") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("-") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("*") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("/"))
            {
                return true;
            }
            else if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("+") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("-") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("*") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("/"))
            {
                return true;
            }

        }
        return false;
    }

    public boolean verificaChamadaDeFuncao(TabelaSimbolos tabelaSimbolos)
    {
        if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("("))
        {
            return true;
        }
        return false;
    }

}
